Library {C}

CMakeλ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ λ―Έλž˜μ— μ‚¬μš©ν•˜κ²Œ 될 μ—¬λŸ¬ λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ„ ν•¨κ»˜ μ»΄νŒŒμΌν•˜κ³  λ§ν¬ν•˜κΈ° μœ„ν•΄ add_subdirectory(), add_library(), [target_]link_library() λ“±λ“± ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ λ°œμƒν•˜λŠ” λ¬Έμ œλ“€μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μƒˆλ‘œμš΄ νŽ˜μ΄μ§€λ₯Ό νŒ λ‹€.

λͺ©ν‘œ

static library

ν˜„μž¬ νŒŒμΌκ΅¬μ‘°λŠ” μ•„λž˜μ™€ κ°™λ‹€. 두 개의 sample_lib νŒŒμΌμ„ 컴파일 ν•˜μ—¬ 라이브러리둜 λ§Œλ“€κ³ , lib_test_mainμ—μ„œ 라이브러리의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°€μ Έλ‹€ μ“Έ 것이닀.

.
β”œβ”€β”€ CMakeLists.txt
β”œβ”€β”€ lib_test_main.cpp
β”œβ”€β”€ sample_lib1.cpp
└── sample_lib2.cpp
// sample_lib1.cpp
int add(const int &a, const int &b)
{
  return a + b;
}

// sample_lib2.cpp
int subtract(const int &a, const int &b)
{
  return a - b;
}

// lib_test_main.cpp
#include <iostream>
int add(const int &a, const int &b);
int main(void)
{
  std::cout << add(1, 2) << "\n";
  return 0;
}

λ¨Όμ € 두 lib νŒŒμΌμ„ μ»΄νŒŒμΌν•œλ‹€. μ •ν™•νžˆ λ§ν•˜μžλ©΄ μ „μ²˜λ¦¬μ™€ 컴파일 κ³Όμ •κΉŒμ§€λ§Œ μˆ˜ν–‰ν•˜μ—¬ λͺ©μ νŒŒμΌμΈ .o νŒŒμΌμ„ λ§Œλ“œλŠ” 것을 λͺ©ν‘œλ‘œ ν•œλ‹€.

➜  lib git:(master) βœ— g++ -c sample_lib1.cpp -std=gnu++17 -o sample_lib1.cpp.o
➜  lib git:(master) βœ— g++ -c sample_lib2.cpp -std=gnu++17 -o sample_lib2.cpp.o
➜  lib git:(master) βœ— tree
.
β”œβ”€β”€ CMakeLists.txt
β”œβ”€β”€ lib_test_main.cpp
β”œβ”€β”€ sample_lib1.cpp
β”œβ”€β”€ sample_lib1.cpp.o
β”œβ”€β”€ sample_lib2.cpp
└── sample_lib2.cpp.o

0 directories, 6 files

이제 λ‹¨μˆœνžˆ 두 λͺ©μ νŒŒμΌμ„ μ•„μΉ΄μ΄λΈŒ ν•œλ‹€.

➜  lib git:(master) βœ— ar -rc MyLib.a *.o
➜  lib git:(master) βœ— tree
.
β”œβ”€β”€ CMakeLists.txt
β”œβ”€β”€ MyLib.a
β”œβ”€β”€ lib_test_main.cpp
β”œβ”€β”€ sample_lib1.cpp
β”œβ”€β”€ sample_lib1.cpp.o
β”œβ”€β”€ sample_lib2.cpp
└── sample_lib2.cpp.o

0 directories, 7 files

사싀 μ΄λ ‡κ²Œ λ‹¨μˆœν•œ μ •λ„μ˜ λΌμ΄λΈŒλŸ¬λ¦¬λŠ” ꡳ이 μ•„μΉ΄μ΄λΈŒ ν•˜μ§€ μ•Šκ³  ν•œ λ²ˆμ— GCC 인자둜 넣어버렀도 상관이 μ—†μ§€λ§Œ 정적 라이브러리 파일 ν•˜λ‚˜λ§Œ λ“€κ³ λ‹€λ‹ˆλŠ” 것에 μ˜λ―Έκ°€ 있기 λ•Œλ¬Έμ— ar μ»€λ§¨λ“œλ‘œ μ•„μΉ΄μ΄λΈŒ ν•œ 것이닀.

이제 메인 ν”„λ‘œκ·Έλž¨μ„ μ»΄νŒŒμΌν•˜μž. μ •μƒμ μœΌλ‘œ 잘 μž‘λ™ν•œλ‹€.

➜  lib git:(master) βœ— g++ -c lib_test_main.cpp -std=gnu++17 -o lib_test_main.cpp.o
➜  lib git:(master) βœ— g++ -o TestLib.out lib_test_main.cpp.o MyLib.a 
➜  lib git:(master) βœ— ./TestLib.out 
3
➜  lib git:(master) βœ—

CMake with static library

CMakeλŠ” Makeμ™€λŠ” λ‹€λ₯΄κ²Œ 쀑간에 λ°œμƒν•˜λŠ” λͺ¨λ“  λΆ€μ‚°λ¬Ό (*.o)듀을 μΆ”μƒν™”ν•˜μ˜€κΈ° λ•Œλ¬Έμ— μž¬λ£Œλ“€κ³Ό λ§Œλ“€κ³  싢은 라이브러리 μ΄λ¦„λ§Œ 있으면 μ•Œμ•„μ„œ λ§Œλ“€μ–΄μ€€λ‹€.

cmake_minimum_required(VERSION 3.16)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_BUILD_TYPE DEBUG)

# μ—¬κΈ°μ—λŠ” 라이브러리λ₯Ό λ§Œλ“œλŠ” μ½”λ“œλ§Œ 생성할 κ²ƒμž„.
project("MyLib")
set(CMAKE_VERBOSE_MAKEFILE TRUE) # project() λͺ…령은 이 λ³€μˆ˜λ₯Ό 항상 FALSE둜 μ΄ˆκΈ°ν™”ν•˜κΈ°μ—...
set(PROJECT_VERSION_MAJOR 1)
set(PROJECT_VERSION_MINOR 0)
set(
  LIB_NAME
  "${CMAKE_PROJECT_NAME}.${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}"
)

set(
  LIB_SOURCES
  sample_lib1.cpp
  sample_lib2.cpp
)

# 라이브러리 λ§Œλ“€κΈ° https://matgomes.com/add-library-cmake-create-libraries/
add_library(${LIB_NAME} STATIC ${LIB_SOURCES})

cmakeλ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ build 디렉토리λ₯Ό ν•˜λ‚˜ λ§Œλ“€κ³  κ±°κΈ° μ•ˆμ—μ„œ cmake λͺ…λ Ήμ–΄λ₯Ό μΉœλ‹€.

**➜  lib git:(master) βœ— mkdir build
➜  lib git:(master) βœ— cd build
➜  build git:(master) βœ— cmake ..**
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build

λ˜λŠ” κ·Έλƒ₯ build 디렉토리λ₯Ό λ§Œλ“€μ§€ μ•Šκ³  cmake νŒŒλΌλ©”ν„°λ‘œ λΉŒλ“œν•  디렉토리λ₯Ό λͺ…μ‹œν•΄λ„ 되긴 ν•œλ‹€.

**➜  lib git:(master) βœ— cmake -S . -B build**
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build
**➜  lib git:(master) βœ— tree**
.
β”œβ”€β”€ CMakeLists.txt
β”œβ”€β”€ build
β”‚   β”œβ”€β”€ CMakeCache.txt
β”‚   β”œβ”€β”€ CMakeFiles
β”‚   β”‚   β”œβ”€β”€ 3.16.3
β”‚   β”‚   β”‚   β”œβ”€β”€ CMakeCCompiler.cmake
β”‚   β”‚   β”‚   β”œβ”€β”€ CMakeCXXCompiler.cmake
β”‚   β”‚   β”‚   β”œβ”€β”€ CMakeDetermineCompilerABI_C.bin
β”‚   β”‚   β”‚   β”œβ”€β”€ CMakeDetermineCompilerABI_CXX.bin
β”‚   β”‚   β”‚   β”œβ”€β”€ CMakeSystem.cmake
β”‚   β”‚   β”‚   β”œβ”€β”€ CompilerIdC
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ CMakeCCompilerId.c
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ a.out
β”‚   β”‚   β”‚   β”‚   └── tmp
β”‚   β”‚   β”‚   └── CompilerIdCXX
β”‚   β”‚   β”‚       β”œβ”€β”€ CMakeCXXCompilerId.cpp
β”‚   β”‚   β”‚       β”œβ”€β”€ a.out
β”‚   β”‚   β”‚       └── tmp
β”‚   β”‚   β”œβ”€β”€ CMakeDirectoryInformation.cmake
β”‚   β”‚   β”œβ”€β”€ CMakeOutput.log
β”‚   β”‚   β”œβ”€β”€ CMakeTmp
β”‚   β”‚   β”œβ”€β”€ Makefile.cmake
β”‚   β”‚   β”œβ”€β”€ Makefile2
β”‚   β”‚   β”œβ”€β”€ MyLib.1.0.dir
β”‚   β”‚   β”‚   β”œβ”€β”€ DependInfo.cmake
β”‚   β”‚   β”‚   β”œβ”€β”€ build.make
β”‚   β”‚   β”‚   β”œβ”€β”€ cmake_clean.cmake
β”‚   β”‚   β”‚   β”œβ”€β”€ cmake_clean_target.cmake
β”‚   β”‚   β”‚   β”œβ”€β”€ depend.make
β”‚   β”‚   β”‚   β”œβ”€β”€ flags.make
β”‚   β”‚   β”‚   β”œβ”€β”€ link.txt
β”‚   β”‚   β”‚   └── progress.make
β”‚   β”‚   β”œβ”€β”€ TargetDirectories.txt
β”‚   β”‚   β”œβ”€β”€ cmake.check_cache
β”‚   β”‚   └── progress.marks
β”‚   β”œβ”€β”€ Makefile
β”‚   └── cmake_install.cmake
β”œβ”€β”€ lib_test_main.cpp
β”œβ”€β”€ sample_lib1.cpp
└── sample_lib2.cpp

9 directories, 31 files

이제 우리 ν”„λ‘œμ νŠΈλ₯Ό μœ„ν•œ λ©”μ΄ν¬νŒŒμΌμ„ 생성해 μ£Όμ—ˆμœΌλ‹ˆ make λͺ…λ Ήμ–΄λ§Œ 치면 λͺ¨λ“  λΉŒλ“œκ°€ λλ‚œλ‹€. μΌλΆ€λ‘œ CMAKE_VERBOSE_MAKEFILE을 TRUE둜 μ„€μ •ν•΄ μ£Όμ—ˆκΈ° λ•Œλ¬Έμ— μ—„μ²­ λ§Žμ€ λ‘œκ·Έκ°€ μƒκ²¨λ‚¬μ§€λ§Œ 이것을 λΆ„μ„ν•˜λ©΄ CMakeκ°€ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ λ³Ό 수 μžˆλ‹€.

**➜  build git:(master) βœ— make**
/usr/bin/cmake -S/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib -B/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build/CMakeFiles /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build'
make -f CMakeFiles/MyLib.1.0.dir/build.make CMakeFiles/MyLib.1.0.dir/depend
make[2]: Entering directory '/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build'
cd /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build/CMakeFiles/MyLib.1.0.dir/DependInfo.cmake --color=
Scanning dependencies of target MyLib.1.0
make[2]: Leaving directory '/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build'
make -f CMakeFiles/MyLib.1.0.dir/build.make CMakeFiles/MyLib.1.0.dir/build
make[2]: Entering directory '/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build'
[ 33%] Building CXX object CMakeFiles/MyLib.1.0.dir/sample_lib1.cpp.o
**/usr/bin/c++    -g   -std=gnu++17 -o CMakeFiles/MyLib.1.0.dir/sample_lib1.cpp.o -c /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/sample_lib1.cpp**
[ 66%] Building CXX object CMakeFiles/MyLib.1.0.dir/sample_lib2.cpp.o
**/usr/bin/c++    -g   -std=gnu++17 -o CMakeFiles/MyLib.1.0.dir/sample_lib2.cpp.o -c /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/sample_lib2.cpp**
[100%] Linking CXX static library libMyLib.1.0.a
/usr/bin/cmake -P CMakeFiles/MyLib.1.0.dir/cmake_clean_target.cmake
/usr/bin/cmake -E cmake_link_script CMakeFiles/MyLib.1.0.dir/link.txt --verbose=1
**/usr/bin/ar qc libMyLib.1.0.a  CMakeFiles/MyLib.1.0.dir/sample_lib1.cpp.o CMakeFiles/MyLib.1.0.dir/sample_lib2.cpp.o
/usr/bin/ranlib libMyLib.1.0.a**
make[2]: Leaving directory '/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build'
[100%] Built target MyLib.1.0
make[1]: Leaving directory '/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build'
/usr/bin/cmake -E cmake_progress_start /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build/CMakeFiles 0

μš”μ•½ν•΄λ³΄λ©΄β€¦

c++ -g -std=gnu++17 -o CMakeFiles/MyLib.1.0.dir/sample_lib1.cpp.o -c sample_lib1.cpp

c++ -g -std=gnu++17 -o CMakeFiles/MyLib.1.0.dir/sample_lib2.cpp.o -c sample_lib2.cpp

ar qc libMyLib.1.0.a  CMakeFiles/MyLib.1.0.dir/sample_lib1.cpp.o CMakeFiles/MyLib.1.0.dir/sample_lib2.cpp.o

/usr/bin/ranlib libMyLib.1.0.a

μ΄μ •λ„λ‘œ μš”μ•½ν•΄ λ³Ό 수 μžˆκ² λ‹€. μ—¬κΈ°μ„œ c++ λͺ…λ Ήμ–΄λŠ” g++ λͺ…령어와 λ™μΌν•˜λ‹€ (μš°λΆ„νˆ¬20.04κΈ°μ€€) μ†μˆ˜ λΉŒλ“œν•œ 것과 비ꡐ해본닀면 ar -rc 와 ar qc 의 차이인 λ“― ν•˜λ‹€.

결둠적으둜 파일이 μ—„μ²­λ‚˜κ²Œ 많이 μƒκ²¨λ‚˜κΈ΄ ν–ˆμ§€λ§Œ μš°λ¦¬λŠ” build/{νƒ€κ²Ÿμ΄λ¦„}만 보면 λœλ‹€. μš°λ¦¬λŠ” libMyLib.1.0.a 파일이 μ΅œμ’… νƒ€κ²Ÿμ΄λ‹€. λ§Œμ•½ 이 μ•„μΉ΄μ΄λΈŒλ₯Ό λ©”μΈν•¨μˆ˜κ°€ 달린 ν”„λ‘œκ·Έλž¨μ— λ§ν¬μ‹œν‚€λ €λ©΄ μœ„μ—μ„œ ν•œ 것과 λ˜‘κ°™μ΄ ν•˜λ©΄ λœλ‹€.

➜  lib git:(master) βœ— g++ lib_test_main.cpp build/libMyLib.1.0.a 
➜  lib git:(master) βœ— ./a.out
3

shared library

μ΄λ²ˆμ—” 동적 라이브러리λ₯Ό λ§Œλ“€μ–΄ λΉŒλ“œκ³Όμ •μ— μ–΄λ–»κ²Œ ν¬ν•¨λ˜λŠ”μ§€ μ•Œμ•„λ³Ό 것이닀. λ¨Όμ € μ†μˆ˜ μž‘μ—…ν•˜λŠ” 방법을 λ¨Όμ € ν•΄λ³΄μž. https://medium.com/meatandmachines/shared-dynamic-libraries-in-the-c-programming-language-8c2c03311756 λ₯Ό μ°Έκ³ ν–ˆλ‹€.

➜  lib git:(master) βœ— g++ -g -fPIC -Wall -Werror -Wextra -pedantic sample_lib*.cpp -shared -o libMyLib.so
➜  lib git:(master) βœ— ls
CMakeLists.txt  libMyLib.so  lib_test_main.cpp  sample_lib1.cpp  sample_lib2.cpp
➜  lib git:(master) βœ— g++ -g -Wall lib_test_main.cpp libMyLib.so
➜  lib git:(master) βœ— l
total 84
drwxr-xr-x 2 chltm chltm  4096 Jul 18 18:13 ./
drwxr-xr-x 6 chltm chltm  4096 Jul 18 17:15 ../
-rw-r--r-- 1 chltm chltm   631 Jul 18 17:14 CMakeLists.txt
-rwxr-xr-x 1 chltm chltm 39584 Jul 18 18:13 a.out*
-rwxr-xr-x 1 chltm chltm 18800 Jul 18 18:07 libMyLib.so*
-rw-r--r-- 1 chltm chltm   142 Jul 18 16:05 lib_test_main.cpp
-rw-r--r-- 1 chltm chltm    75 Jul 18 16:06 sample_lib1.cpp
-rw-r--r-- 1 chltm chltm    60 Jul 18 17:08 sample_lib2.cpp
➜  lib git:(master) βœ— ./a.out
./a.out: error while loading shared libraries: libMyLib.so: cannot open shared object file: No such file or directory

https://www.lesstif.com/lpt/shared-library-dependencies-linux-ldd-95880421.html

ldd λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ ν•„μš”ν•œ 곡유 라이브러리의 μ˜μ‘΄μ„±μ„ 좜λ ₯ν•΄ μ€€λ‹€κ³  ν•œλ‹€. ν˜„μž¬ a.out 의 μ˜μ‘΄μ„±μ„ ν™•μΈν•΄λ³΄μž.

➜  lib git:(master) βœ— ldd ./a.out
        linux-vdso.so.1 (0x00007fffb64d5000)
        libMyLib.so => not found
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f8a7b103000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f8a7b0e8000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8a7aef6000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8a7ada7000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f8a7b2f7000)

파일 μœ„μΉ˜λ₯Ό 확인할 수 μ—†λ‹€κ³ ? λ°”λ‘œ μ˜†μ— 두고도 λͺ» μ°ΎλŠ”λ‹€κ³ ?

https://stackoverflow.com/a/8538605/6428901 에 λ”°λ₯΄λ©΄, μŠ€νƒ λ‹€λ“œ μ‹œμŠ€ν…œ 라이브러리 (λ‚˜μ˜ κ²½μš°λŠ” /lib/x86_64-linux-gnu/ )κ°€ μ•„λ‹Œ κ²½μš°λŠ” ν™˜κ²½λ³€μˆ˜μ— ν•΄λ‹Ή 곡유 라이브러리의 μœ„μΉ˜λ₯Ό μΆ”κ°€ν•˜λŠ” κ²ƒμœΌλ‘œ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€κ³  ν•œλ‹€.

➜  lib git:(master) βœ— export LD_LIBRARY_PATH=.
➜  lib git:(master) βœ— ./a.out
3

와 λœλ‹€! ν•œκ°€μ§€ 걱정은, 이 세상에 μ–Όλ§ˆλ‚˜ λ§Žμ€ 동적 λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ΄ λΆ€μœ ν•˜κ³  또 μ„œλ‘œ μ–½νžˆκ³  μ„₯νžˆλŠ”λ°, ν”„λ‘œκ·Έλž¨ μ•ˆμ— 동적 라이브러리λ₯Ό 직접 μœ„μΉ˜ν•  수 μ—†λ‹€λ©΄ 맀번 μ΄λ ‡κ²Œ ν™˜κ²½λ³€μˆ˜ 섀정을 ν•΄μ£Όκ³  μ˜μ‘΄μ„± 관리λ₯Ό ν•΄μ£Όμ–΄μ•Ό ν•˜λŠ” 걸까?

CMake with shared library

CMake with static library 에 μ μ—ˆλ˜ μ½”λ“œμ˜ λ§ˆμ§€λ§‰ 쀄에 STATIC ν‚€μ›Œλ“œλ₯Ό SHARED ν‚€μ›Œλ“œλ‘œ λ°”κΎΈκΈ°λ§Œ ν•˜λ©΄ λœλ‹€.

# static library
add_library(${LIB_NAME} STATIC ${LIB_SOURCES})
# shared library
add_library(${LIB_NAME} SHARED ${LIB_SOURCES})
**➜  lib git:(master) βœ— cmake -S . -B build**
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build
**➜  lib git:(master) βœ— make --directory=build**
make: Entering directory '/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build'
/usr/bin/cmake -S/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib -B/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build/CMakeFiles /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build'
make -f CMakeFiles/MyLib.1.0.dir/build.make CMakeFiles/MyLib.1.0.dir/depend
make[2]: Entering directory '/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build'
cd /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build/CMakeFiles/MyLib.1.0.dir/DependInfo.cmake --color=
Scanning dependencies of target MyLib.1.0
make[2]: Leaving directory '/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build'
make -f CMakeFiles/MyLib.1.0.dir/build.make CMakeFiles/MyLib.1.0.dir/build
make[2]: Entering directory '/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build'
[ 33%] Building CXX object CMakeFiles/MyLib.1.0.dir/sample_lib1.cpp.o
**/usr/bin/c++  -DMyLib_1_0_EXPORTS  -g -fPIC   -std=gnu++17 -o CMakeFiles/MyLib.1.0.dir/sample_lib1.cpp.o -c /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/sample_lib1.cpp**
[ 66%] Building CXX object CMakeFiles/MyLib.1.0.dir/sample_lib2.cpp.o
**/usr/bin/c++  -DMyLib_1_0_EXPORTS  -g -fPIC   -std=gnu++17 -o CMakeFiles/MyLib.1.0.dir/sample_lib2.cpp.o -c /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/sample_lib2.cpp**
[100%] Linking CXX shared library libMyLib.1.0.so
/usr/bin/cmake -E cmake_link_script CMakeFiles/MyLib.1.0.dir/link.txt --verbose=1
**/usr/bin/c++ -fPIC -g  -shared -Wl,-soname,libMyLib.1.0.so -o libMyLib.1.0.so CMakeFiles/MyLib.1.0.dir/sample_lib1.cpp.o CMakeFiles/MyLib.1.0.dir/sample_lib2.cpp.o** 
make[2]: Leaving directory '/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build'
[100%] Built target MyLib.1.0
make[1]: Leaving directory '/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build'
/usr/bin/cmake -E cmake_progress_start /home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build/CMakeFiles 0
make: Leaving directory '/home/chltm/workspace/choi-workspace/c++/learning_cmake/lib/build'

μ—¬κΈ°μ—μ„œ λˆˆμ—¬κ²¨ 보아야 ν•  λΆ€λΆ„λ§Œ μš”μ•…ν•˜μžλ©΄β€¦

c++ -DMyLib_1_0_EXPORTS -g -fPIC -std=gnu++17 -o sample_lib1.cpp.o -c sample_lib1.cpp

c++ -DMyLib_1_0_EXPORTS -g -fPIC -std=gnu++17 -o sample_lib2.cpp.o -c sample_lib2.cpp

c++ -fPIC -g -shared -Wl,-soname,libMyLib.1.0.so -o libMyLib.1.0.so sample_lib1.cpp.o sample_lib2.cpp.o 

첫번째, 두 번째 μ€„μ˜ 경우 -D μ˜΅μ…˜μ„ ν†΅ν•΄μ„œ Define ꡬ문을 μΆ”κ°€ν•œ 것 말곀 νŠΉλ³„νžˆ λ‹€λ₯Έ 점은 μ—†λŠ” 것 κ°™λ‹€. λ¬Έμ œλŠ” μ„Έ 번째 μ€„μ—μ„œ 두 개의 λͺ©μ νŒŒμΌμ„ 톡해 동적 라이브러리 libMyLib.1.0.so λ₯Ό λ§Œλ“œλŠ” 데 λ“€μ–΄κ°„ νŒŒλΌλ©”ν„°μΈλ°, λͺ¨λ₯΄λŠ” 것듀이 λ§Žλ‹€.

동적 라이브러리λ₯Ό λ§ν¬ν•˜μ—¬ 메인 ν”„λ‘œκ·Έλž¨μ„ λΉŒλ“œν•΄λ³΄μž.

➜  lib git:(master) βœ— g++ lib_test_main.cpp build/libMyLib.1.0.so 
➜  lib git:(master) βœ— ./a.out
./a.out: error while loading shared libraries: libMyLib.1.0.so: cannot open shared object file: No such file or directory

μ•„κΉŒμ™€ λ˜‘κ°™μ€ μ—λŸ¬κ°€ λ‚˜μ™”λ‹€. 이젠 ν•΄κ²°ν•  수 μžˆλŠ” κ°„λ‹¨ν•œ 문제.

➜  lib git:(master) βœ— echo $LD_LIBRARY_PATH 
.
➜  lib git:(master) βœ— export LD_LIBRARY_PATH=.:./build:
➜  lib git:(master) βœ— ./a.out
3